package com.winbomb.kingcard;

/**
 * 牌的接口类
 * 
 * @author winbomb
 * 
 */

public interface ICard {

	/**
	 * 获得牌的点数
	 * 
	 * 1：A 11：J 12：Q 13：K 14: 小王 15：大王
	 * 
	 * @return
	 */
	public int getPoint();

	/**
	 * 获得花色
	 * 
	 * @return
	 */
	public Suit getSuit();

	/**
	 * 是否是小王
	 * 
	 * @return
	 */
	public boolean isBlackJoker();

	/**
	 * 是否是大王
	 * 
	 * @return
	 */
	public boolean isRedJoker();

	/**
	 * 获取牌的大小顺序，用于界面展示的时候使牌排列的有序
	 * 
	 * @return
	 */
	public int getOrdinal();

	/**
	 * 这张牌是否被选中
	 * 
	 * @return
	 */
	public boolean isSelected();

	/**
	 * 设置牌是否被选中
	 */
	public void setSelected(boolean isSelected);

	/**
	 * 牌是否是盖上的
	 * 
	 * @return
	 */
	public boolean isCovered();

	/**
	 * 设置牌是否盖上
	 * 
	 * @param isCovered
	 */
	public void setCovered(boolean isCovered);

	/**
	 * 设置标志
	 * 
	 * @param flag
	 */
	public void setFlag(int flag);

	/**
	 * 清除标志
	 * 
	 * @param flag
	 */
	public void clearFlag(int flag);

	/**
	 * 清除所有标志
	 */
	public void clearAllFlags();

	/**
	 * 测试标志,如果该标志位为1,则返回true,为0则返回false;
	 * 
	 * @param flag
	 * @return
	 */
	public boolean testFlag(int flag);

	/**
	 * 添加一项技能
	 * 
	 * @param skillName
	 */
	public void addSkill(String skillName);

	/**
	 * 测试是否拥有该项技能
	 * 
	 * @param skillName
	 * @return
	 */
	public boolean hasSkill(String skillName);

	/**
	 * 删除某项技能
	 * 
	 * @param skillName
	 */
	public void removeSkill(String skillName);

	/**
	 * 清除所有技能
	 */
	public void clearAllSkills();

	/**
	 * 这张牌能够击败tgCard,即比较两张牌的大小,所谓的大小包括比较相克关系和点数.
	 * 
	 * 如果这张牌克tgCard,则这张牌 大,如果这张牌被tgCard克,则这张牌小. 如无相克关系
	 * 
	 * 且不同花色,则无大小之分,返回false. 若同花色,则比较点数,点数大的就大一些.
	 * 
	 * 以上是对于普通情况,对于特殊情况:
	 * 
	 * 1. 如果本方是大王或者小王,只要与tgCard颜色不同即可克之.(这里不计算距离,只算相克关系,后同)
	 * 
	 * 2. 如果tgCard为大王或小王,需要本方为不同颜色的J/Q/K/A/2方能克之.
	 * 
	 * 3. 如果本方是A,则只要与tgCard颜色不同即可克之.
	 * 
	 * @param tgCard
	 * @return
	 */
	public boolean canBeat(ICard tgCard);

	/**
	 * 比较两张牌的大小
	 * 
	 * 1. 如果本牌可以beat掉tgCard(即canBeat返回true),而tgCard无法beat掉本牌,则本牌胜,返回1.
	 * 
	 * 2. 反过来,如果tgCard可以beat掉本牌,而本牌无法beat掉tgCard,则tgCard胜,返回-1;
	 * 
	 * 3. 如果两方都可以beat掉对方,则比较点数,点数大的胜.
	 * 
	 * 4. 如果两方都不可以beat掉对方,则返回平手
	 * 
	 * @param tgCard
	 * @return
	 */
	public int compareTo(ICard tgCard);

}
